package com.sky.d_thread;

import java.util.concurrent.atomic.AtomicInteger;

import org.junit.Test;

/**
 * 高并发 
 * 钱可以使浅薄的人变得更浅薄，使深刻的人变得更深刻
 * @Author:hjt
 */
public class HeighParallel {

	/**
	
	1.为什么需要并行：
	  	业务要求和性能
	  
	2.业务模型的需要：
	  	并不是为了提高系统性能，而是确实在业务上需要多个执行单元
	  	如：HTTP服务器，为每一个Socket连接新建一个处理线程
	  	让不同线程承担不同的业务工作
	  	简化任务调度
	  
	3.概念
		同步(synchronous)和异步(asynchronous)
			同步是一次调用每一步按步骤执行完毕之后返回
			异步是一次调用可以不需要等待所有的步骤执行完毕，调用就可以返回了，结果出来之后再显示不影响其它操作
		
	  	并发(Concurrency)和并行(Parallelism)
	  		并发是多个处理器同时执行
	  		并行是一个处理器一会执行这个线程一会执行另外的线程
	  	
	  	临界区
	  		表示公共资源或共享数据，多个线程使用，一个线程占用其它线程需等待
	  		
	  	阻塞(Blocking)和非阻塞(Non-Blocking)
	  		阻塞：一个线程占用，会阻塞其它线程使用资源
	  		非阻塞：多个线程可以共用临界区的资源
	  		
	  	死锁(DeadLock)、饥饿(Starvation)和活锁(LiveLock)
	  		死锁：比如两个线程需要两个资源，各自占用不同的资源，还未释放需要去获取另一个资源，
	  			而另一资源被占用，出险死锁现象
	  		饥饿：指一直获取不到资源的线程，无法执行
	  		活锁：两个线程同时去获取一个资源时，都检测到资源存在去获取，获取时看对方需要，都不礼让了，又检测资源存在
	  			又同时获取，循环往复
	  		
	  	并行的级别
	  		阻塞：当一个线程进入临界区之后，其它线程必须等待
	  		非阻塞
	  			无障碍(Obstruction-Free)
	  				无障碍是一种最弱的非阻塞调度
	  				自由出入临界区
	  				无竞争时，有限步内完成操作
	  				有竞争时，回滚数据
	  			无锁(Lock-Free)
	  				是无障碍的
	  				保证有一个线程可以胜出
	  			无等待(Wait-Free)
	  				无锁的
	  				要求所有的线程都必须在有限步内完成
	  				无饥饿的
	  				
	  4.并行的两个重要定律
	  	Amdahl定律(阿姆达尔定律)
	  		定义了串行系统并行化之后的加速比的计算公式和理论上限
	  		加速比：加速比 = 优化前系统耗时 / 优化后系统耗时
	  			加速比 = 1 / (F + 1/n(1 - F))
	  			F：串行比例
	  			n：处理器个数
	  		增加CPU处理器的数量并不一定能起到有效的作用提高系统内可并行化的模块比重，
	  		合理增加并行处理器数量，才能以最小的投入，得到最大的加速比
	  		
	  		
	  	Gustafson定律(古斯塔夫定律)
	  		处理器个数，串行比例和加速比之间的关系
	  			执行时间：a(串行时间) + b(并行时间)
	  			总执行时间： a + n*b  n是处理器的个数
	  			加速比 = (a + n*b)/(a + b)
	  			定义：F = a / (a + b) 串行比例
	  			加速比 S(n) = n - F(n - 1)
	  		只要有足够的并行化，那么加速比和CPU个数成正比
	  
	 */
	
	@Test
	public void testLockFree() {

		AtomicInteger atomicInteger = new AtomicInteger(1);
		int expect = atomicInteger.get();
		while(!atomicInteger.compareAndSet(expect, expect + 1)){
			expect = atomicInteger.get();
		}
	}
	
	/**
	 
		1.什么是线程
			线程是进程内的执行单元
			状态：
				新建状态(New):当线程对象创建后，即进入新建状态 ，Thread t = new Thread();
				就绪状态(Runnable):线程调用 start方法进入就绪状态，等待CPU调度执行
				运行状态(Running):CPU调度就绪状态的线程，此时线程进入运行状态
				阻塞状态(Blocked):放弃对CPU的使用，停止执行
					等待阻塞:运行状态中的线程执行wait方法，
					同步阻塞：线程获取synchronized同步锁失败（被其它线程占用）
					其它阻塞：调用线程sleep或jion方法、I/O请求，当sleep超时、jion终止、I/O处理完毕，线程重新进入就绪状态
				死亡状态(Dead):线程执行结束或run异常退出了，线程生命周期结束
	
		2.线程的基本操作
			新建线程：
				Thread t = new Thread();
				t.start();
			终止线程：
				Thread.stop()，不推荐使用，会释放所有的monitor
			中断线程：
				public void interrupt()  				//中断线程
				public boolean isInterrupted()			//判断是否被中断
				public static boolean interrupted()		//判断是否被中断，并清除当前中断状态
			挂起(suspend)和继续执行(resume)线程
				suspend不会释放锁
				如果加锁在resume之前，会发送死锁的现象
			等待线程(join)和谦让(yeild)
				 public final synchronized void join(long millis)
				 yeild放开抢到的锁，所有线程重新抢占
    		守护进程：DaemonDemo
    		线程优先级：PriorityDemo	
		3.线程的同步操作
			synchronized:  示例见sync包下
				指定加锁对象：对给定对象加锁，进入同步代码前要获得给定对象的锁
				直接作用于实例方法：相当于对当前实例加锁，进入同步代码前要获得当前实例的锁
				直接作用于静态方法：相当于对当前类加锁,进入同步代码前要获得当前类的锁
			Object.wait()  Object.notify()

	 */
	  
	
}
